import axios from 'axios'
import type { AxiosError, AxiosResponse } from 'axios'
import { useTokenStore } from '@/stores/modules/token'
import { ElMessage, ElLoading } from 'element-plus'
// 导入路由用于页面跳转
import router from '@/router'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';

const service = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API,
    timeout: 5000
})

// 请求拦截
service.interceptors.request.use((config: import('axios').InternalAxiosRequestConfig) => {
    // 配置token
    const store = useTokenStore()
    const token = store.token
    // 配置token, 特殊接口在请求头不需要传递token
    const isToken = (config.headers || {}).skipToken === false;
    if (token && !isToken) {
        config.headers = config.headers || {};
        config.headers.Authorization = `Bearer ${token}`
    }

    // FormData数据去请求头Content-Type
    if (config.data instanceof FormData) {
        delete config.headers['Content-Type'];
    }

    return config
}, (error: AxiosError) => {
    // 请求错误时隐藏加载动画
    // hideLoading()
    ElMessage.error('请求配置错误')
    return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use((response: AxiosResponse) => {
    const { code, message, data } = response.data
    // 二进制数据则直接返回
    if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
        return response.data;
    }

    // 成功状态码判断（根据项目实际情况调整）
    if (code === 200 || code === 0) {
        // ElMessage.success(message || '操作成功')
        // 操作成功提示（可选，根据需求决定哪些接口需要提示）
        return data
    } else {
        // 业务错误处理
        ElMessage.error(message || '操作失败')
        return Promise.reject(new Error(message || 'Error'))
    }
}, (error) => {
    // 网络错误处理
    if (error.message.includes('Network Error')) {
        ElMessage.error('网络异常，请检查网络连接')
    } else if (error.message.includes('timeout')) {
        ElMessage.error('请求超时，请稍后重试')
    } else if (error.response) {
        // HTTP状态码错误处理
        const status = error.response.status
        const store = useTokenStore()

        switch (status) {
            case 401:
                // 未授权，清除token并跳转登录页
                store.setToken('')
                router.push('/login')
                ElMessage.error('登录已过期，请重新登录')
                break
            case 403:
                // 权限不足
                ElMessage.error('没有操作权限，请联系管理员')
                break
            case 404:
                // 资源不存在
                ElMessage.error('请求资源不存在')
                break
            case 500:
                // 服务器错误
                ElMessage.error('服务器内部错误，请稍后再试')
                break
            default:
                ElMessage.error(`请求错误: ${status}`)
        }
    } else {
        ElMessage.error('未知错误')
    }
    return Promise.reject(error)
}
)

export default service